package com.generico.dao.ctg;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.sql.JoinType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.generico.base.BaseDaoImpl;
import com.generico.dto.ctg.CtgProducto;
import com.generico.dto.ctg.CtgSubTipoSucursal;
import com.generico.dto.ctg.CtgSucursal;
import com.generico.dto.ctg.CtgTipoSucursal;
import com.generico.exception.AsiWebException;
import com.main.java.DocumentoAdjunto;


@Repository
public class CtgProductoDaoImpl extends BaseDaoImpl implements CtgProductoDao{
	
	
	private static final String SUCCESS = "success";
	private static final String FAILURE = "failure";
	private static final String MESSAGE = "message";

	@Autowired
	private SessionFactory sessionFactory;

	private Session openSession() {
		return sessionFactory.getCurrentSession();
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> getAllActivesAsArray() {
		Criteria criteria = openSession().getSessionFactory().getCurrentSession().createCriteria(CtgProducto.class);
		criteria.createAlias("ctgProductoColor","ctgProductoColor", JoinType.LEFT_OUTER_JOIN);
		criteria.createAlias("ctgProductoMaterial","ctgProductoMaterial", JoinType.LEFT_OUTER_JOIN);
		criteria.createAlias("ctgProductoTamanio","ctgProductoTamanio", JoinType.LEFT_OUTER_JOIN);
		criteria.createAlias("ctgProductoGarantia","ctgProductoGarantia", JoinType.LEFT_OUTER_JOIN);
		criteria.setProjection(Projections.projectionList().
				add(Projections.property("ctgProductoId")).
				add(Projections.property("ctgProductoNombre")).
				add(Projections.property("ctgProductoDescripcion")).
				add(Projections.property("ctgProductoActivo")).
				add(Projections.property("ctgProductoCodigo")).
				add(Projections.property("ctgProductoPrecio")).
				add(Projections.property("ctgProductoTipo")).
				add(Projections.property("ctgProductoImage")).
				add(Projections.property("ctgProductoColor.ctgCatalogoId")).
				add(Projections.property("ctgProductoColor.ctgCatalogoNombre")).
				add(Projections.property("ctgProductoMaterial.ctgCatalogoId")).
				add(Projections.property("ctgProductoMaterial.ctgCatalogoNombre")).
				add(Projections.property("ctgProductoTamanio.ctgCatalogoId")).
				add(Projections.property("ctgProductoTamanio.ctgCatalogoNombre")).
				add(Projections.property("ctgProductoGarantia.ctgCatalogoId")).
				add(Projections.property("ctgProductoGarantia.ctgCatalogoNombre")).
				add(Projections.property("ctgProductoGarantia.ctgCatalogoDetallar")));
//		criteria.add(Restrictions.eq("ctgProductoActivo", "1"));
		criteria.addOrder(Order.asc("ctgProductoNombre"));
		try {
			return (List<Object[]>) findByCriteria(criteria);
		} catch (AsiWebException e) {
			logger.error(e, e);
			return Collections.emptyList();
		}
	}
	
	public Map<String, Object> guardarCtgProducto (CtgProducto ctgProducto, Long UploadMaxSize, CommonsMultipartFile uploadFile) throws AsiWebException{
		
		Map<String, Object> result = new HashMap<String, Object>();
		if(UploadMaxSize > 0 && uploadFile.getSize() > UploadMaxSize){
			result.put(MESSAGE, "Tama\u00F1o de Archivo excede el m\u00E1ximo permitido");
			result.put(FAILURE, true);
			return result;
		}
		int dot = StringUtils.lastIndexOf(uploadFile.getOriginalFilename(), ".");
		String extension = (dot != -1) ? StringUtils.substring(uploadFile.getOriginalFilename(), dot + 1) : "";

		ctgProducto.setCtgProductoImage(uploadFile.getBytes());
		if(ctgProducto.getCtgProductoId() != null && ctgProducto.getCtgProductoId() > 0) update(ctgProducto);
		else save(ctgProducto);
		return result;
	}

	public void eliminarCtgProducto (Long ctgProductoId) throws AsiWebException{
		String hql = "delete from CtgProducto where ctgProductoId= :ctgProductoId";
		openSession().getSessionFactory().getCurrentSession().createQuery(hql).setLong("ctgProductoId", ctgProductoId).executeUpdate();
	}
	
	public CtgProducto findByCtgProductoIdId (Long ctgProductoId) throws AsiWebException{
		CtgProducto ctgProducto = new CtgProducto();
		ctgProducto = (CtgProducto) findById(CtgProducto.class, ctgProductoId);
		return ctgProducto;
	}
	
	@SuppressWarnings("unchecked")
	public List<CtgProducto> getCtgProductos(Long ctgProductoId) {
		List<CtgProducto> lista = Collections.emptyList();
		Criteria criteria = openSession().getSessionFactory().getCurrentSession().createCriteria(CtgProducto.class);
		criteria.add(Restrictions.eq("ctgProductoId", ctgProductoId));
		try {
			lista = (List<CtgProducto>) findByCriteria(criteria);
		} catch (AsiWebException e) {
			logger.error("Error obteniendo registros de CtgProducto: " + e.getMessage(), e);
		}
		return lista;
	}
	
	
}
